package com.lcm.Student;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class APP {
    static ArrayList<User> list = new ArrayList<>();
    static {
        list.add(new User("张三","1234zs","123456789987654321","12112345678"));
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作1.登录，2.注册，3.忘记密码");
            String choose = sc.next();
            switch (choose){
                case "1":
                    login(list);//登录
                    break;
                case "2":
                    register(list);//注册
                    break;
                case "3":
                    forgetpassword(list);//忘记密码
                    break;
                case "4":
                    System.out.println("谢谢使用，再见");
                    System.exit(0);
                default:
                    System.out.println("抱歉，无此选项。");
            }
        }
    }

    private static void register(ArrayList<User> list) {
        Scanner scanner = new Scanner(System.in);
        String username;
        String againpassword;
        String password;
        String personID;
        String phoneNumber;
        //用户名验证
        while (true) {
            System.out.println("请输入你的用户名");
            username = scanner.next();
//        1，用户名需要满足以下要求：
            boolean flag1 = chekUsername(username);
            if (!flag1){
                System.out.println("格式不正确，请重新输入");
                continue;
            }
            //用户名唯一
             boolean flag2 = contains(list,username);
            if (flag2){
                System.out.println("当前用户名已存在，请重新录入。");
                continue;
            }else {
                break;
            }
        }
        //密码键盘输入两次，两次一致才可以进行注册。
        while (true) {
            System.out.println("请你输入密码：");
            password = scanner.next();
            System.out.println("请你再次输入密码");
            againpassword = scanner.next();
            if (!(password.equals(againpassword))){
                System.out.println("密码不一致，请重新输入");
                continue;
            }else {
                break;
            }
        }
        //身份证号验证
        while (true) {
            System.out.println("请输入你的身份证号");
            personID = scanner.next();
            boolean flag = chekPersonID(personID);
            if (flag){
                System.out.println("身份证验证不正确，请重新输入");
                continue;
            }else {
                break;
            }
        }
        //手机号验证
        while (true) {
            System.out.println("请输入你的手机号");
            phoneNumber = scanner.next();
            boolean flag = chekPhonenumber(phoneNumber);
            if (flag){
                break;
            }else {
                System.out.println("手机号码格式不正确，请重新输入");
                continue;
            }
        }
        User u = new User(username,password,personID,phoneNumber);
        list.add(u);
        System.out.println("注册成功");
    }

    private static boolean chekPhonenumber(String phoneNumber) {
//        长度为11位
        if (phoneNumber.length()!=11){
            return false;
        }
//        不能以0为开头
       if (phoneNumber.startsWith("0")){
           return false;
       }
//        必须都是数字
        for (int i = 0; i < phoneNumber.length(); i++) {
            char c = phoneNumber.charAt(i);
            if (!(c>='0'&&c<='9')){
                return false;
            }
        }
        return true;
    }

    private static boolean chekPersonID(String personID) {
//        长度为18位
        if (personID.length()!=18){
            return false;
        }
//        不能以0为开头
        if (personID.startsWith("0")){
            return false;
        }
//        前17位，必须都是数字
        for (int i = 0; i < personID.length()-1; i++) {
            char c = personID.charAt(i);
            if (!(c>'0'&&c<'9')){
                return false;
            }
        }
//        最后一位可以是数字，也可以是大写x或者小写x
        char c = personID.charAt(17);
        if (!(c>='0'&&c<='9')||(c=='X')||(c=='x')){
            return false;
        }else {
            return true;
        }
    }
//   判断用户是否存在
    private static boolean contains(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
              User user = list.get(i);
              String rightusername = user.getUsername();
              if (rightusername.equals(username)){
                  return true;
              }
        }
        return false;
    }

    private static boolean chekUsername(String username) {
//            用户名长度必须在3-15位之间。
        int len = username.length();
        if (len>15||len<3){
            System.out.println("用户名长度不准确");
            return false;
        }
//            只能是字母加数字的组合，
        for (int i = 0; i <username.length(); i++) {
            char c = username.charAt(i);
            if (!(('z'>=c && c>='a')||('Z'>=c && c>='A')||('9'>=c && c>='0'))){
                return false;
            }
        }
//        不能是纯数字
        int count = 0;
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if (('z'>=c && c>='a')||('Z'>=c && c>='A')){
                count++;
                break;
            }
        }
        return count>0;
    }

    private static void forgetpassword(ArrayList<User> list) {
//        1.键盘录入用户名，判断当前用户是否存在，如不存在，直接结束方法，并提示：未注册
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = sc.next();
        boolean flag  =contains(list,username);
        if (!flag) {
            System.out.println("未注册");
            return;
        }
//        2 . 键盘录入身份证号码和手机号码
        System.out.println("请输入你的身份证号码");
        String personID = sc.next();
        System.out.println("请输入你的手机号码");
        String phonenNumber = sc.next();
//        3. 判断当前用户的身份证号码和手机号码是否一致，
//        如果一致。则提示输入密码，进行修改。
        int index = findIndex(list,username);
//        如果不一致，则提示：账号信息不匹配，修改失败
        User user = list.get(index);
        if(!(user.getPersonID().equals(personID) && user.getPhoneNumber().equals(phonenNumber))){
            System.out.println("账号信息不匹配，修改失败");
            return;
        }
        String password;
        while (true) {
            System.out.println("请输入你的新密码");
            password = sc.next();
            System.out.println("请再次输入新密码");
            String againpassword = sc.next();
            if (password.equals(againpassword)){
                break;
            }else {
                System.out.println("密码不一致，请重新输入");
                continue;
            }
        }
        user.setPassworld(password);
        System.out.println("密码修改成功");
    }

    private static int findIndex(ArrayList<User> list, String username ) {
        for (int i = 0; i < list.size(); i++) {
            User user =list.get(i);
            if (user.getPersonID().equals(username)){
                return i;
            }
        }
        return -1;
    }

    private static void login(ArrayList<User> list) {
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            //        1.键盘录入用户名
            System.out.println("请输入你的用户名");
            String username = sc.next();
//        用户名如果未注册，直接结束方法，并提示：用户名未注册，请先注册
            boolean flag = contains(list,username);
            if (!flag){
                System.out.println("用户名未注册，请先注册再登陆");
                return;
            }
//        2.键盘录入密码
            System.out.println("请你输入用户密码");
            String password = sc.next();
//        判断验证码是否正确，如不正确，重新输入
            while (true) {
                String rightcode = getCode();
                System.out.println("验证码为"+rightcode);
//        3.键盘录入验证码
                System.out.println("请输入验证码");
                String code = sc.next();
                if (code.equalsIgnoreCase(rightcode)){
                    System.out.println("验证码正确");
                    break;
                }else {
                    System.out.println("验证码不正确，请重新输入");
                    continue;
                }
            }
//        再判断用户名和密码是否正确，有3次机会
            User userInfo = new User(username,password,null,null);
            boolean flag1 = checkUserInfo(list,userInfo);
            if (flag1){
                System.out.println("登录成功，可以开始使用学生管理系统");
                StudentSystem ss = new StudentSystem();
                ss.startStudentSystem();
                break;
            }else {
                System.out.println("用户名和密码不正确，请重新输入");
                if (i==2){
                    System.out.println("你的机会已用完，账户"+username+"已锁定，请联系程序员17354288048");
                    return;
                }else {
                    System.out.println("用户名和密码错误，请重新输入,你还有"+(2-i)+"次机会");
                    continue;
                }
            }
        }
    }

    private static boolean checkUserInfo(ArrayList<User> list, User user) {
        for (int i = 0; i < list.size(); i++) {
            User user1 = list.get(i);
            if (user1.getUsername().equals(user.getUsername()) && user1.getPassworld().equals(user.getPassworld())){
                return true;
            }
        }
        return false;
    }

    //    生成一个随机验证码
    private static String getCode(){
    //创建个集合
    ArrayList<Character> list = new ArrayList<>();
    for (int i = 0; i < 26; i++) {
        list.add((char)('a'+i));
        list.add((char)('A'+i));
    }
    //随机取出4个字符
    StringBuilder sb = new StringBuilder();
    Random r = new Random();
    for (int i = 0; i < 4; i++) {
        int index = r.nextInt(list.size());
        char c = list.get(index);
        sb.append(c);
    }
    //随机数字添加进去
    int number = r.nextInt(10);
    sb.append(number);
    //将数字和任意位置上的字符交换
    char[] arr  = sb.toString().toCharArray();
    int index1 = r.nextInt(5);
    char temp = arr[4];
    arr[4] = arr[index1];
    arr[index1] = temp;
    return new String(arr);

}
}